// 此文件作为 Generator 的核心入口
// 需要导出一个继承自 Yeoman Generator 的类型
// Yeoman Generator 在工作时会自动调用我们在此类型中定义的一些生命周期方法
// 我们在这些方法中可以通过调用父类提供的一些工具方法实现一些功能，例如文件写入

const Generator = require('yeoman-generator')

module.exports = class extends Generator {
    prompting () {
        // Yeoman 在询问用户环节会自动调用此方法
        // 在此方法中可以调用父类的 prompt() 方法发出对用户的命令行询问
        // 返回一个promise方法, 使得Yeoman在工作时有更好的工作流程控制
        // promt()接收一个数组参数，数组每项都是一个问题对象
        return this.prompt([
            {
                // 获取方式，用户输入
                type: 'input',
                // 获取结果的键
                name: 'name',
                // 给用户的提示即问题
                message: 'Your project name',
                // appname为项目生成目录名称默认值
                default: this.appname
            }
        ])
        .then(answers => {
            // answers 输出结果 => {name: 'user input value'} 
            this.answers = answers
            // 使得writing中可以直接使用
        })
    }

    writing() {
        // Yeoman 自动在生成文件阶段调用此方法
        // 我们这里尝试往项目目录中写入文件
        // 此处fs时高度封装的filesystem模块 功能更强大
        // write(文件绝对路径，文件内容)
        // this.fs.write(
        //     this.destinationPath('temp.txt'),
        //     Math.random().toString()
        // )

        // 通过模板方式写入文件到目标目录

        // 模板文件路径
        const tmpl  = this.templatePath('bar.html')
        // 输出目标路径
        const output = this.destinationPath('bar.html')
        // 模板数据上下文
        // const context = { title: 'Hello zce~', success: false}
        const context = this.answers
        // 将模板文件映射到输出目录
        this.fs.copyTpl(tmpl, output, context)
    }
}